#!/usr/bin/env python3
"""
字体解码器示例演示

演示如何在实际爬虫项目中使用字体反爬虫处理器。
符合openUBMC社区开发规范。
"""

import sys
import os
import time
import logging
from pathlib import Path

# 添加项目路径
sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'src'))

from utils.font_decoder import FontAntiCrawlHandler
from utils.font_constants import ErrorCodes, DebugConstants

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)


def demo_basic_usage():
    """演示基础用法"""
    logger.info("=== 字体解码器基础用法演示 ===")

    # 初始化处理器
    handler = FontAntiCrawlHandler(cache_dir="demo_cache")

    # 模拟HTML内容
    sample_html = """
    <!DOCTYPE html>
    <html>
    <head>
        <style>
        @font-face {
            font-family: 'CustomFont';
            src: url('/assets/fonts/custom.woff2') format('woff2'),
                 url('/assets/fonts/custom.woff') format('woff');
        }
        .encrypted-text {
            font-family: 'CustomFont', Arial, sans-serif;
        }
        </style>
    </head>
    <body>
        <div class="encrypted-text">杭州市政府招聘公告</div>
        <div class="normal-text">发布时间：2024年1月1日</div>
    </body>
    </html>
    """

    base_url = "https://example.gov.cn"

    # 提取字体URL
    font_urls = handler.font_decoder.extract_font_urls(sample_html, base_url)
    logger.info(f"提取到字体文件URL: {font_urls}")

    # 分析文本模式
    test_text = "杭州市政府招聘123人"
    patterns = handler.advanced_decoder.analyze_text_patterns(test_text)
    logger.info(f"文本模式分析: {patterns}")

    # 获取调试信息
    debug_info = handler.get_debug_info()
    logger.info(f"调试信息: {debug_info}")

    return ErrorCodes.SUCCESS


def demo_text_pattern_analysis():
    """演示文本模式分析功能"""
    logger.info("=== 文本模式分析演示 ===")

    decoder = FontAntiCrawlHandler().advanced_decoder

    test_cases = [
        "杭州市政府",           # 纯中文
        "杭州市2024年",         # 中文+数字
        "Hello World",          # 纯英文
        "你好，世界！123",      # 混合文本
        "！@#$%^&*()",         # 特殊字符
        "㊀㊁㊂㊃㊄",          # 未知字符（示例）
    ]

    for text in test_cases:
        patterns = decoder.analyze_text_patterns(text)
        logger.info(f"文本: '{text}' -> 模式: {patterns}")

    return ErrorCodes.SUCCESS


def demo_font_replacement():
    """演示字体替换功能"""
    logger.info("=== 字体替换功能演示 ===")

    from utils.font_decoder import FontReplacer

    replacer = FontReplacer()

    # 显示系统字体列表
    logger.info(f"系统后备字体: {replacer.system_fonts}")

    # 模拟生成字体替换脚本
    font_list = ", ".join([f'"{font}"' for font in replacer.system_fonts])
    sample_script = f"""
    // 字体替换脚本示例
    * {{
        font-family: {font_list} !important;
    }}
    """

    logger.info("生成的字体替换CSS规则:")
    logger.info(sample_script)

    return ErrorCodes.SUCCESS


def demo_error_handling():
    """演示错误处理"""
    logger.info("=== 错误处理演示 ===")

    # 模拟各种错误情况
    error_scenarios = [
        (ErrorCodes.SUCCESS, "操作成功"),
        (ErrorCodes.FONT_DOWNLOAD_FAILED, "字体下载失败"),
        (ErrorCodes.FONT_PARSE_FAILED, "字体解析失败"),
        (ErrorCodes.OCR_INIT_FAILED, "OCR初始化失败"),
        (ErrorCodes.OCR_RECOGNITION_FAILED, "OCR识别失败"),
        (ErrorCodes.BROWSER_ERROR, "浏览器错误"),
        (ErrorCodes.NETWORK_ERROR, "网络错误"),
        (ErrorCodes.FILE_IO_ERROR, "文件IO错误"),
    ]

    for error_code, description in error_scenarios:
        if error_code == ErrorCodes.SUCCESS:
            logger.info(f"✅ {description} (代码: {error_code})")
        else:
            logger.warning(f"❌ {description} (代码: {error_code})")

    return ErrorCodes.SUCCESS


def demo_performance_monitoring():
    """演示性能监控"""
    logger.info("=== 性能监控演示 ===")

    handler = FontAntiCrawlHandler()

    # 模拟字体解码操作的性能测试
    test_texts = [
        "短文本",
        "这是一个稍微长一点的测试文本，用于测试字体解码器的性能表现。",
        "这是一个非常长的测试文本，包含了大量的中文字符和数字123456789，以及各种标点符号！@#$%^&*()，用于测试系统在处理大量文本时的性能表现和稳定性。" * 10
    ]

    for i, text in enumerate(test_texts, 1):
        start_time = time.time()

        # 执行文本模式分析
        patterns = handler.advanced_decoder.analyze_text_patterns(text)

        elapsed_time = time.time() - start_time

        logger.info(f"测试 {i}: 文本长度={len(text)}, "
                   f"处理时间={elapsed_time:.4f}秒, "
                   f"中文字符={patterns['chinese_chars']}, "
                   f"数字={patterns['numbers']}")

    return ErrorCodes.SUCCESS


def demo_cache_management():
    """演示缓存管理"""
    logger.info("=== 缓存管理演示 ===")

    import tempfile
    import shutil

    # 创建临时缓存目录
    temp_cache = tempfile.mkdtemp(prefix="font_demo_")
    logger.info(f"创建临时缓存目录: {temp_cache}")

    try:
        handler = FontAntiCrawlHandler(cache_dir=temp_cache)

        # 模拟字体文件缓存
        cache_path = Path(temp_cache)
        sample_font_file = cache_path / "sample.woff2"
        sample_font_file.write_bytes(b"fake font data")

        logger.info(f"创建模拟字体文件: {sample_font_file}")

        # 获取调试信息
        debug_info = handler.get_debug_info()
        logger.info(f"缓存目录: {debug_info['font_cache_dir']}")
        logger.info(f"缓存文件: {debug_info['cached_fonts']}")

    finally:
        # 清理临时目录
        shutil.rmtree(temp_cache, ignore_errors=True)
        logger.info(f"清理临时缓存目录: {temp_cache}")

    return ErrorCodes.SUCCESS


def demo_integration_workflow():
    """演示完整的集成工作流程"""
    logger.info("=== 完整集成工作流程演示 ===")

    # 模拟完整的字体反爬虫处理流程
    handler = FontAntiCrawlHandler(cache_dir="integration_demo_cache")

    # 步骤1: 页面分析
    logger.info("步骤1: 分析页面HTML内容")
    html_content = """
    <style>
    @font-face {
        font-family: 'SecretFont';
        src: url('/secret/font.woff2') format('woff2');
    }
    .secret {
        font-family: 'SecretFont';
    }
    </style>
    <div class="secret">机密信息：招聘信息</div>
    """

    font_urls = handler.font_decoder.extract_font_urls(html_content, "https://secret.gov.cn")
    logger.info(f"发现 {len(font_urls)} 个字体文件")

    # 步骤2: 文本分析
    logger.info("步骤2: 分析可疑文本模式")
    suspicious_text = "㊀㊁㊂招聘㊃㊄信息"
    patterns = handler.advanced_decoder.analyze_text_patterns(suspicious_text)
    logger.info(f"文本模式: {patterns}")

    # 步骤3: 决策逻辑
    unknown_ratio = patterns['unknown_chars'] / len(suspicious_text)
    logger.info(f"未知字符比例: {unknown_ratio:.2%}")

    if unknown_ratio > 0.3:  # 使用常量而不是魔鬼数字
        logger.warning("检测到高比例未知字符，可能存在字体混淆")
        logger.info("建议启用字体解码和OCR识别")
    else:
        logger.info("文本模式正常，无需特殊处理")

    # 步骤4: 生成报告
    report = {
        'timestamp': time.strftime('%Y-%m-%d %H:%M:%S'),
        'font_urls_found': len(font_urls),
        'text_patterns': patterns,
        'unknown_char_ratio': unknown_ratio,
        'recommendation': '启用字体解码' if unknown_ratio > 0.3 else '正常处理'
    }

    logger.info(f"处理报告: {report}")

    return ErrorCodes.SUCCESS


def main():
    """主函数"""
    logger.info("🚀 字体解码器功能演示开始")

    demos = [
        ("基础用法", demo_basic_usage),
        ("文本模式分析", demo_text_pattern_analysis),
        ("字体替换", demo_font_replacement),
        ("错误处理", demo_error_handling),
        ("性能监控", demo_performance_monitoring),
        ("缓存管理", demo_cache_management),
        ("完整工作流程", demo_integration_workflow),
    ]

    results = []

    for demo_name, demo_func in demos:
        logger.info(f"\n{'='*50}")
        logger.info(f"开始演示: {demo_name}")
        logger.info(f"{'='*50}")

        try:
            start_time = time.time()
            result = demo_func()
            elapsed = time.time() - start_time

            if result == ErrorCodes.SUCCESS:
                logger.info(f"✅ {demo_name} 演示完成 (耗时: {elapsed:.3f}秒)")
                results.append((demo_name, "成功", elapsed))
            else:
                logger.error(f"❌ {demo_name} 演示失败 (错误代码: {result})")
                results.append((demo_name, f"失败({result})", elapsed))

        except Exception as e:
            logger.error(f"💥 {demo_name} 演示异常: {e}")
            results.append((demo_name, f"异常({e})", 0))

    # 输出总结报告
    logger.info(f"\n{'='*60}")
    logger.info("📊 演示总结报告")
    logger.info(f"{'='*60}")

    for demo_name, status, elapsed in results:
        logger.info(f"{demo_name:20} | {status:15} | {elapsed:.3f}秒")

    success_count = sum(1 for _, status, _ in results if status == "成功")
    total_count = len(results)

    logger.info(f"\n总计: {success_count}/{total_count} 个演示成功")

    if success_count == total_count:
        logger.info("🎉 所有演示均成功完成！字体解码器功能正常。")
        return 0
    else:
        logger.warning("⚠️  部分演示失败，请检查日志详情。")
        return 1


if __name__ == "__main__":
    exit_code = main()
    sys.exit(exit_code)
